// https://course.rs/basic/variable.html
pub(crate) fn main() {
    // 变量可变性
    //         Rust 的变量在默认情况下是不可变的。前文提到，这是 Rust 团队为我们精心设计的语言特性之一，让我们编写的代码更安全，性能也更好。
    //         当然你可以通过 mut 关键字让变量变为可变的，让设计更灵活。
    //
    //         如果变量 a 不可变，那么一旦为它绑定值，就不能再修改 a。举个例子，在我们的工程目录下使用 cargo new variables 新建一个项目，叫做 variables 。
    let x = 5;
    let mut x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);

    //  使用下划线开头忽略未使用的变量
    //         如果你创建了一个变量却不在任何地方使用它，Rust 通常会给你一个警告，因为这可能会是个 BUG。
    //         但是有时创建一个不会被使用的变量是有用的，比如你正在设计原型或刚刚开始一个项目。
    //         这时你希望告诉 Rust 不要警告未使用的变量，为此可以用下划线作为变量名的开头：
    let _x = 5;
    // warning: unused variable: `y`
    let y = 10;

    // 变量解构
    // let 表达式不仅仅用于变量的绑定，还能进行复杂变量的解构：从一个相对复杂的变量中，匹配出该变量的一部分内容：
    let (a, mut b): (bool, bool) = (true, false);
    // a = true,不可变; b = false，可变
    println!("a = {:?}, b = {:?}", a, b);

    b = true;
    assert_eq!(a, b);
}

// 解构式赋值
struct Struct {
    e: i32,
}

fn test1() {
    // let (a, b, c, d, e);

    // (a, b) = (1, 2);
    // // _ 代表匹配一个值，但是我们不关心具体的值是什么，因此没有使用一个变量名而是使用了 _
    // [c, .., d, _] = [1, 2, 3, 4, 5];
    // Struct { e, .. } = Struct { e: 5 };
    //
    // assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
}

// 变量遮蔽(shadowing)
fn test2() {
    let x = 5;
    // 在main函数的作用域内对之前的x进行遮蔽
    let x = x + 1;
    {
        // 在当前的花括号作用域内，对之前的x进行遮蔽
        let x = x * 2;
        println!("The value of x in the inner scope is: {}", x);
    }
    println!("The value of x is: {}", x);
}
